home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
gnu
/
mtools.lha
/
mtools-2.0.7
/
match.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-09-10
|
2KB
|
92 lines
/*
* Do shell-style pattern matching for '?', '\', '[..]', and '*' wildcards.
* Returns 1 if match, 0 if not.
*/
#include <stdio.h>
int
match(s, p)
char *s, *p;
{
int matched, reverse;
char first, last;
for (; *p != '\0'; s++, p++) {
switch (*p) {
case '?': /* match any one character */
if (*s == '\0')
return(0);
break;
case '*': /* match everything */
while (*p == '*')
p++;
/* if last char in pattern */
if (*p == '\0')
return(1);
/* search for next char in pattern */
matched = 0;
while (*s != '\0') {
if (*s == *p) {
matched = 1;
break;
}
s++;
}
if (!matched)
return(0);
break;
case '[': /* match range of characters */
first = '\0';
matched = 0;
reverse = 0;
while (*++p != ']') {
if (*p == '^') {
reverse = 1;
p++;
}
first = *p;
if (first == ']' || first == '\0')
return(0);
/* if 2nd char is '-' */
if (*(p + 1) == '-') {
p++;
/* set last to 3rd char ... */
last = *++p;
if (last == ']' || last == '\0')
return(0);
/* test the range of values */
if (*s >= first && *s <= last) {
matched = 1;
p++;
break;
}
return(0);
}
if (*s == *p)
matched = 1;
}
if (matched && reverse)
return(0);
if (!matched)
return(0);
break;
case '\\': /* Literal match with next character */
p++;
/* fall thru */
default:
if (*s != *p)
return(0);
break;
}
}
/* string ended prematurely ? */
if (*s != '\0')
return(0);
else
return(1);
}